﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Office.Tools.Ribbon;
using OffInvoiceExcelAddIn.XmlMngFiles;
using System.IO;
using System.Windows.Forms;
using OffInvoiceExcelAddIn.FacturaeFiles;
using Microsoft.Office.Core;
using System.Xml;
using System.Globalization;
using Microsoft.Office.Interop.Excel;
using OffInvoiceExcelAddIn.UBLFiles;

namespace OffInvoiceExcelAddIn
{
    public partial class Ribbon1
    {
        #region "Fields"

        /// <summary>
        /// Variable de tipo bool que indica si existe o no un control
        /// </summary>
        private bool InvoiceControlExists;

        /// <summary>
        /// Variable que referencia a la aplicacion
        /// </summary>
        Microsoft.Office.Interop.Excel.Application application;

        /// <summary>
        /// Variable que referencia al parser que se encarga de manejar los archivos de gestion de facturas
        /// </summary>
        XmlFileMngParser parser;

        /// <summary>
        /// Variable de tipo ConfiData, que una vez instanciada no se elimina hasta que se cierra la aplicación
        /// que contiene la configuración predeterminada por el usuario.De esta manera no se consulta constantemente
        /// el archivo xml que almacena esta configuración.
        /// </summary>
        ConfigData configuration;

        /// <summary>
        /// Variable de tipo string que indica el estado de una factura
        /// </summary>
        string status = "";

        /// <summary>
        /// Variable de tipo char[] que contiene los caracteres que se deben elimiar cuando se cogen los valores
        /// de los controles de la plantilla.
        /// </summary>
        char[] x = { '\r', '\a', '\n' };

        bool firstTaskpane = true;

        #endregion

        #region "Private Methods"

        /// <summary>
        /// Método que se ejecuta cuando el Ribbon se carga.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
        {
            LoadLanguage();
            application = Globals.ThisAddIn.Application;
            parser = new XmlFileMngParser();
            status = Globals.ThisAddIn.GetControlValue(ControlList.Tag.Status);
            if (!string.IsNullOrEmpty(status))
            {
                if (status.Equals("ISSUED"))
                    ckBoxIssued.Checked = true;
                else if (status.Equals("RECEIVED"))
                    ckBoxReceived.Checked = true;
                else
                    ckBoxDraft.Checked = true;
            }
            else
            {
                status = "DRAFT";
                ckBoxDraft.Checked = true;
            }
        }


        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre el botón de nueva factura.
        /// Se abre la plantilla predeterminada por el usuario en la configuracion con los datos del emisor cargados,
        /// también definidos en la configuracón.Si la plantilla no es válida, se abre una por defecto que si lo es.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnNew_Click(object sender, RibbonControlEventArgs e)
        {

            LoadConfiguration();

            if (File.Exists(configuration.UrlTemplate))
            {
                object temp = configuration.UrlTemplate;
                TemplateController template = new TemplateController();
                template.LoadInvoiceTemplate(temp, true);
                Globals.ThisAddIn.LoadIssuerData(configuration);

            }
            else
            {
                ControlMessages msg = ControlMessages.getInstance();
                MessageBox.Show(msg.getMessage(ControlMessages.Msg.InfoNotExistDefaultTemplate), msg.getMessage(ControlMessages.Msg.CaptionConfig), MessageBoxButtons.OK, MessageBoxIcon.Information);
                try
                {
                    Language labels = Language.getInstance();
                    object temp = Globals.ThisAddIn.EnvironmentVariable + Paths.TemplatePath + Globals.ThisAddIn.TemplatesDirectories + labels.getLabels("BasicTemplate") + ".xltx";
                    TemplateController template = new TemplateController();
                    template.LoadInvoiceTemplate(temp, true);
                    Globals.ThisAddIn.LoadIssuerData(configuration);
                }
                catch (Exception)
                {

                }
            }
            status = "DRAFT";
            ckBoxDraft.Checked = true;
            ckBoxReceived.Checked = false;
            ckBoxIssued.Checked = false;
        }

        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre el botón de guardar.
        /// Muestra un cuadro de dialogo para guardar la facturae.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSave_Click(object sender, RibbonControlEventArgs e)
        {
            try
            {

                updateRegistry(saved(status), false, "");

            }
            catch (Exception)
            {
            }
        }


        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre el botón de mis facturas.
        /// Muestra un TaskPane con los datos referentes a las facuras.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnMyInvoices_Click(object sender, RibbonControlEventArgs e)
        {

            if (!InvoiceControlExists)
            {
                Globals.ThisAddIn.OpenInvoiceTaskPane(this, firstTaskpane);
                firstTaskpane = false;


            }
            else
            {
                Globals.ThisAddIn.RemoveInvoiceTaskPane();
            }

            InvoiceControlExists = !InvoiceControlExists;
        }

        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre el botón de Configuración.
        /// Carga la cofiguración almacenada en el archivo XML y al mostrar el formulario de configuración le pasa
        /// la configuración.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSettings_Click(object sender, RibbonControlEventArgs e)
        {

            LoadConfiguration();
            FrmSettings frmSettings = new FrmSettings();
            frmSettings.Configuration = configuration;
            frmSettings.Show();
        }


        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre el botón de emitir.
        /// Muestra un formulario donde el usuario selecciona el tipo de factura que desea realizar.
        /// Si es electrónica se llama a Emitir y si es en papel se llama a Cerrar.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnInvoiceType_Click(object sender, RibbonControlEventArgs e)
        {

            String control = null;
            try
            {
                Globals.ThisAddIn.document = Globals.ThisAddIn.Application.ActiveWorkbook.ActiveSheet;
                control = Globals.ThisAddIn.getControlByTag(ControlList.Tag.IH_InvoiceNumber).Text;
            }
            catch (Exception) { }

            if (String.IsNullOrEmpty(control))
            {
                ControlMessages controlM = ControlMessages.getInstance();
                MessageBox.Show(controlM.getMessage(ControlMessages.Msg.ErrorWhiteDocument), controlM.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                return;
            }

            FrmInvoiceType f = new FrmInvoiceType();

            if (f.ShowDialog().Equals(DialogResult.OK))
            {
                if (f.Facturae31 || f.Facturae32 || f.UBL || f.CII)
                {
                    string id = Globals.ThisAddIn.GetControlValue(ControlList.Tag.customPartId);
                    CustomXMLPart facturaXMLPart = Globals.ThisAddIn.Application.ActiveWorkbook.CustomXMLParts.SelectByID(id);
                    if (facturaXMLPart == null)
                    {
                        if (f.Facturae31)
                        {
                            Emitir(InvoiceTypes.FACTURAE_3_1);
                        }
                        else if (f.Facturae32)
                        {
                            Emitir(InvoiceTypes.FACTURAE_3_2);
                        }
                        else if (f.UBL)
                        {
                            Emitir(InvoiceTypes.UBL);
                        }
                        else if (f.CII)
                        {
                            Emitir(InvoiceTypes.CII);
                        }
                    }
                    else
                    {
                        ControlMessages controlM = ControlMessages.getInstance();
                        MessageBox.Show(controlM.getMessage(ControlMessages.Msg.InvoiceAlReadySignated), controlM.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    }


                }
                else
                {
                    Cerrar();
                }

            }

        }

        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre el botón de importar factura
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btLoadXmlInvoice_Click(object sender, RibbonControlEventArgs e)
        {
            //Workbook wb = Globals.ThisAddIn.Application.ActiveWorkbook;
            //Globals.ThisAddIn.edit(wb, wb.Sheets[1], false);


            OpenFileDialog op = new OpenFileDialog();
            string filter = "Archivos Xml (*.xml)|*.xml";
            op.Filter = filter;

            if (op.ShowDialog().Equals(DialogResult.OK))
            {
                string file = op.FileName;

                XmlDocument doc = new XmlDocument();
                doc.PreserveWhitespace = true;
                try
                {
                    doc.Load(file);
                }
                catch (Exception)
                {
                    ControlMessages msg = ControlMessages.getInstance();
                    MessageBox.Show(msg.getMessage(ControlMessages.Msg.XmlMalformed), msg.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                    return;
                }

                if (doc.DocumentElement.NamespaceURI.Equals("urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"))
                {
                    LoadController load = new LoadController();
                    load.LoadUBL(file, false, false, true);
                }
                else if (doc.DocumentElement.NamespaceURI.Equals("urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:1"))
                {
                    LoadController load = new LoadController();
                    load.LoadCII(file, false, false, true);
                }
                else
                {
                    LoadController load = new LoadController();
                    load.LoadFacturae(file, false, false, true);
                }
                Globals.ThisAddIn.setControlValue(ControlList.Tag.IH_InvoiceNumber, string.Empty);
                Globals.ThisAddIn.setControlValue(ControlList.Tag.CORR_InvoiceNumber, string.Empty);
                Globals.ThisAddIn.setControlValue(ControlList.Tag.CORR_InvoiceSeriesCode, string.Empty);
                //Globals.ThisAddIn.setFormulas();

                //TemplateController template = new TemplateController();
                //template.enumerateTables();
                //try
                //{
                //    Globals.ThisAddIn.Application.ActiveDocument.Tables[template.t4].Rows[2].Range.Text = string.Empty;
                //}
                //catch (Exception)
                //{

                //}
                status = "DRAFT";
                ckBoxDraft.Checked = true;
                ckBoxReceived.Checked = false;
                ckBoxIssued.Checked = false;
            }

        }

        /// <summary>
        /// Método que abre una galeria de imágenes donde el usurio puede elegir la plantilla con la que desea trabajar.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void wordTemplatesGallery_Click(object sender, RibbonControlEventArgs e)
        {

            LoadConfiguration();
            object temp = null;
            try
            {
                //temp = Globals.ThisAddIn.EnvironmentVariable + Paths.TemplatePath + Globals.ThisAddIn.TemplatesDirectories + wordTemplatesGallery.SelectedItem.Tag.ToString() + ".dotx";
                temp = Globals.ThisAddIn.EnvironmentVariable + Paths.TemplatePath + Globals.ThisAddIn.TemplatesDirectories + gallerySelectedItem() + ".xltx";
            }
            catch (Exception) { }

            TemplateController template = new TemplateController();
            template.LoadInvoiceTemplate(temp, true);
            if (configuration != null)
            {
                Globals.ThisAddIn.LoadIssuerData(configuration);
            }

            status = "DRAFT";
            ckBoxDraft.Checked = true;
            ckBoxReceived.Checked = false;
            ckBoxIssued.Checked = false;
            Globals.ThisAddIn.setControlValue(ControlList.Tag.Status, status);
        }


        /// <summary>
        /// Método que devuevle el nombre de la plantilla seleccionada
        /// </summary>
        /// <returns></returns>
        private string gallerySelectedItem()
        {
            Language labels = Language.getInstance();
            string selecteditemtext = labels.getLabels("BasicTemplate");
            try
            {
                int index = this.wordTemplatesGallery.SelectedItemIndex;
                selecteditemtext = this.wordTemplatesGallery.Items[index].Tag.ToString();
            }
            catch (Exception) { }

            return selecteditemtext;
        }


        /// <summary>
        /// Método que maneja el evento que se produce al hacer click sobre el botón de agregar a facturas recibidas.
        /// Se realiza una validacion de la factura, si todo está bien se añade a recibidas y se actualizan los archivos 
        /// de gestión.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOpenReceivedFacturae_Click(object sender, RibbonControlEventArgs e)
        {
            String control = null;
            try
            {
                control = Globals.ThisAddIn.getControlByTag(ControlList.Tag.IH_InvoiceNumber).Text;
            }
            catch (Exception) { }

            if (!String.IsNullOrEmpty(control))
            {

                try
                {
                    ValidateController v = new ValidateController(Globals.ThisAddIn.GetControlValue(ControlList.Tag.customPartId), true);
                    //if (!Globals.ThisAddIn.validateReceivedInvoice(true))
                    if (!v.result)
                    {
                        return;
                    }
                    ckBoxIssued.Checked = false;
                    ckBoxDraft.Checked = false;
                    Globals.ThisAddIn.getControlByTag(ControlList.Tag.Status).Locked = false;
                    status = "RECEIVED";
                    Globals.ThisAddIn.setControlValue(ControlList.Tag.Status, status);

                    Globals.ThisAddIn.getControlByTag(ControlList.Tag.Status).Locked = true;
                    //Cargo la configuración porque puede darse el caso de que no este cargado todavia
                    LoadConfiguration();

                    string invType = "(P)";
                    string id = Globals.ThisAddIn.GetControlValue(ControlList.Tag.customPartId);
                    if (!string.IsNullOrEmpty(id))
                    {
                        CustomXMLPart customPart = Globals.ThisAddIn.Application.ActiveWorkbook.CustomXMLParts.SelectByID(id);
                        XmlDocument doc = new XmlDocument();
                        doc.PreserveWhitespace = true;
                        doc.LoadXml(customPart.DocumentElement.XML);

                        XmlNode signatureNode = doc.DocumentElement.GetElementsByTagName("Signature").Item(0);
                        if (signatureNode == null)
                            signatureNode = doc.DocumentElement.GetElementsByTagName("ds:Signature").Item(0);
                        if (signatureNode != null)
                        {
                            invType = "(E)";
                        }
                        else
                        {
                            invType = "(P)";
                        }


                    }
                    updateRegistry(configuration.UrlRecived + @"\" + Globals.ThisAddIn.Application.ActiveWorkbook.Name, true, invType);
                    ckBoxIssued.Checked = false;
                    ckBoxReceived.Checked = true;
                    ckBoxDraft.Checked = false;
                    Globals.ThisAddIn.updateTaskPane();
                    ControlMessages msg = ControlMessages.getInstance();
                    MessageBox.Show(msg.getMessage(ControlMessages.Msg.InfoAddRecived), msg.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                }
                catch (Exception exc)
                {
                    ControlMessages msg = ControlMessages.getInstance();
                    if (exc.Message.Equals("InfoInvoiceExist"))
                    {
                        MessageBox.Show(msg.getMessage(exc.Message), msg.getMessage(ControlMessages.Msg.CaptionRibbon), MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return;
                    }

                    string error = string.Concat(msg.getMessage(ControlMessages.Msg.ErrorAddRecived), "\n", exc.Message);
                    MessageBox.Show(error, msg.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                }
            }
            else
            {
                ControlMessages controlM = ControlMessages.getInstance();
                MessageBox.Show(controlM.getMessage(ControlMessages.Msg.ErrorWhiteDocument), controlM.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);

            }
        }


        /// <summary>
        /// Método que maneja el evento que se produce al hacer click sobre el checkboox de Emitida.
        /// Se llama al método que actualiza el estado.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ckBoxIssued_Click(object sender, RibbonControlEventArgs e)
        {
            updateStatusCheck();
        }


        /// <summary>
        /// Método que maneja el evento que se produce al hacer click sobre el checkboox de Recibida.
        /// Se llama al método que actualiza el estado.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ckBoxReceived_Click(object sender, RibbonControlEventArgs e)
        {
            updateStatusCheck();
        }


        /// <summary>
        /// Método que maneja el evento que se produce al hacer click sobre el checkboox de Borrador.
        /// Se llama al método que actualiza el estado.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ckBoxDraft_Click(object sender, RibbonControlEventArgs e)
        {
            updateStatusCheck();
        }


        /// <summary>
        /// Método que maneja el evento que se produce al hacer click sobre el botón de extraer factura.
        /// Abre un cuadro de dialogo donde el usuario elige donde quiere guardar la factura xml
        /// y se extrae la factura.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btExportToXml_Click(object sender, RibbonControlEventArgs e)
        {
            SaveFileDialog sd = new SaveFileDialog();
            sd.Filter = "Archivos Xml (*.xml)|*.xml";
            sd.ShowDialog();
            string path = sd.FileName;
            try
            {
                ExportController export = new ExportController();
                export.extraerfacturae(path, true);
            }
            catch (Exception)
            {
                try
                {
                    ExportController export = new ExportController();
                    export.exportPaperInvoice(path, true);
                }
                catch (Exception)
                {
                    ControlMessages controlM = ControlMessages.getInstance();
                    MessageBox.Show(controlM.getMessage(ControlMessages.Msg.ErrorInvoiceNotGenerated), controlM.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);

                }
            }
        }


        /// <summary>
        /// Método que maneja el evento que se produce al hacer click sobre el boton de validar factura.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btInvoiceValidation_Click(object sender, RibbonControlEventArgs e)
        {
            try
            {
                String control = null;
                try
                {
                    control = Globals.ThisAddIn.getControlByTag(ControlList.Tag.IH_InvoiceNumber).Text;
                }
                catch (Exception) { }

                if (!String.IsNullOrEmpty(control))
                {
                    //Globals.ThisAddIn.validateReceivedInvoice(false);
                    ValidateController v = new ValidateController(Globals.ThisAddIn.GetControlValue(ControlList.Tag.customPartId), false);
                }
                else
                {
                    ControlMessages controlM = ControlMessages.getInstance();
                    MessageBox.Show(controlM.getMessage(ControlMessages.Msg.ErrorWhiteDocument), controlM.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);

                }
            }
            catch (Exception)
            {
                ControlMessages controlM = ControlMessages.getInstance();
                MessageBox.Show(controlM.getMessage(ControlMessages.Msg.ErrorWhiteDocument), controlM.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
            }
        }


        /// <summary>
        /// Método que maneja el evento que se produce cuando se hace click con el ratón sobre el
        /// boton de importar factura.
        /// Se abre un cuadro de dialogo donde el usuario seleccioana la factura xml que desea cargar,
        /// se realiza una validacion de la factura, si es válida se carga en la plantilla que mejor
        /// se ajuste, si no es válida se le informa al usuario y se le da la posibilidad de ver los
        /// resultados de la validación
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnImportReceivedInvoice_Click(object sender, RibbonControlEventArgs e)
        {



            OpenFileDialog op = new OpenFileDialog();
            string filter = "Archivos Xml (*.xml)|*.xml";
            op.Filter = filter;
            op.ShowDialog();
            string file = op.FileName;
            ControlMessages msg = ControlMessages.getInstance();


            if (!string.IsNullOrEmpty(file))
            {

                try
                {
                    ImportInvoiceController iic = new ImportInvoiceController(file);

                    Globals.ThisAddIn.setControlValue(ControlList.Tag.Status, "RECEIVED");

                    //ANTES DE GUARDAR EL DOCUMENTO SE DEBE BLOQUEAR LA PLANTILLA PARA IMPEDIR SU EDICION

                    Globals.ThisAddIn.lockDocument(true);

                    ckBoxReceived.Checked = true;
                    ckBoxIssued.Checked = false;
                    ckBoxDraft.Checked = false;
                    status = "RECEIVED";
                }
                catch (Exception exc)
                {
                    if (exc.Message.Equals("1"))
                    {
                        MessageBox.Show(msg.getMessage(ControlMessages.Msg.ErrorSchema), msg.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                        return;
                    }
                    if (exc.Message.Equals(ControlMessages.Msg.XmlMalformed.ToString("g")))
                    {
                        MessageBox.Show(msg.getMessage(ControlMessages.Msg.XmlMalformed), msg.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                        return;
                    }
                    MessageBox.Show(msg.getMessage(exc.Message), msg.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                }

            }
        }


        /// <summary>
        /// Método que emite una factura.
        /// Abre el cuadro de diálogo para que el usuario indique donde quiere guardar la factura,
        /// por defecto será en la carpeta de facturas emitidas definida en la configuración, despues
        /// se llama a emiir factura donde se genera la factura, se hace la validacion contable, se firma
        /// y se valdia la firma.Si todo va bien, se actualizan los archivos de gestión, agregando la factura
        /// al archivo de emitidas y eliminandolo de borradore si exisiera.
        /// </summary>
        private void Emitir(int format)
        {
            ControlMessages msg = ControlMessages.getInstance();
            Globals.ThisAddIn.LoadCountryComboBox();
            LoadConfiguration();

            FacturaeFieldAndValues datos = Globals.ThisAddIn.getAllData();

            string check = ComprobarDatosObligatorios(datos.getList());
            if (!String.IsNullOrEmpty(check))
            {
                MessageBox.Show(msg.getMessage("MsgIncompleteData"), msg.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Information);
                try
                {
                    Globals.ThisAddIn.getControlByTag(check).Select();
                }
                catch (Exception)
                {
                }
                return;
            }


            SaveFileDialog op = new SaveFileDialog();
            op.Filter = "Arhivos de Excel 2010 (*.xlsx)|*.xlsx";
            op.InitialDirectory = setInitiaDirectory("ISSUED");
            string name = string.Concat(Globals.ThisAddIn.GetControlValue(ControlList.Tag.SP_TaxIdentificationNumber), Globals.ThisAddIn.GetControlValue(ControlList.Tag.IH_InvoiceNumber), Globals.ThisAddIn.GetControlValue(ControlList.Tag.IH_InvoiceSeriesCode));
            op.FileName = name;

            if (op.ShowDialog() == DialogResult.Cancel)
            {
                return;
            }
            string path = Globals.ThisAddIn.EnvironmentVariable + Paths.CustomXmlPartPath;
            string pathSignate = Globals.ThisAddIn.EnvironmentVariable + Paths.SignateCustomXmlPartPath;

            if (!string.IsNullOrEmpty(op.FileName))
            {
                try
                {




                    //Globals.ThisAddIn.emitirFactura(path, pathSignate, configuration);
                    IssuedController emitir = new IssuedController(datos);
                    emitir.issuedInvoice(path, pathSignate, configuration, format);


                    ckBoxIssued.Checked = true;
                    ckBoxReceived.Checked = false;
                    ckBoxDraft.Checked = false;
                    status = "ISSUED";

                    Globals.ThisAddIn.setControlValue(ControlList.Tag.Status, status);

                    string serie = Globals.ThisAddIn.GetControlValue(ControlList.Tag.IH_InvoiceSeriesCode);
                    string n_factura = Globals.ThisAddIn.GetControlValue(ControlList.Tag.IH_InvoiceNumber);
                    string cif = Globals.ThisAddIn.GetControlValue(ControlList.Tag.BP_TaxIdentificationNumber);


                    //ANTES DE GUARDAR EL DOCUMENTO SE DEBE BLOQUEAR LA PLANTILLA PARA IMPEDIR SU EDICION

                    Globals.ThisAddIn.lockDocument(true);

                    //Añado la factura al registro de emitidos.
                    updateRegistry(op.FileName, false, "(E)");

                    object readOnly = true; object missing = System.Reflection.Missing.Value;
                    object filename = op.FileName;


                    string data = Globals.ThisAddIn.GetXmlFromResource(pathSignate);
                    Globals.ThisAddIn.AddCustomXmlPart(data, Globals.ThisAddIn.Application.ActiveWorkbook);


                    Globals.ThisAddIn.Application.ActiveWorkbook.Save();

                    string fecha = Globals.ThisAddIn.GetControlValue(ControlList.Tag.InvIssue_IssueDate);

                    CultureInfo cult = new CultureInfo(Globals.ThisAddIn.Application.LanguageSettings.get_LanguageID(Microsoft.Office.Core.MsoAppLanguageID.msoLanguageIDUI));
                    DateTime issueDate = DateTime.Parse(fecha, cult);

                    //Elimino el borrador
                    parser.removeInvoive(serie, n_factura, cif, Globals.ThisAddIn.EnvironmentVariable + Paths.DraftPath + issueDate.Year.ToString() + issueDate.Month.ToString() + ".xml");


                    Globals.ThisAddIn.updateTaskPane();


                    MessageBox.Show(msg.getMessage(ControlMessages.Msg.InfoGeneratedInvoice), msg.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Information);

                }
                catch (Exception ex)
                {
                    if (ex.Message.Equals("ErrorCertificateNull") || ex.Message.Equals("NotSigned"))
                        return;
                    if (ex.Message.Equals("ErrorCheckSignature"))
                    {
                        MessageBox.Show(msg.getMessage(ControlMessages.Msg.InfoInvoiceValidation), msg.getMessage(ControlMessages.Msg.CaptionRibbon), MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }

                    if (ex.Message.Equals("ErrorCorrectiveReason"))
                    {
                        MessageBox.Show(msg.getMessage(ControlMessages.Msg.ErrorCorrectiveReason), msg.getMessage(ControlMessages.Msg.CaptionRibbon), MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }

                    if (ex.Message.Equals("ErrorCorrectiveMethod"))
                    {
                        MessageBox.Show(msg.getMessage(ControlMessages.Msg.ErrorCorrectiveMethod), msg.getMessage(ControlMessages.Msg.CaptionRibbon), MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }

                    if (ex.Message.Equals("InfoInvoiceExist"))
                    {
                        MessageBox.Show(msg.getMessage(ex.Message), msg.getMessage(ControlMessages.Msg.CaptionRibbon), MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return;
                    }
                    MessageBox.Show(ex.Message, msg.getMessage(ControlMessages.Msg.CaptionRibbon), MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        #endregion

        #region "Public Methods"

        /// <summary>
        /// Método que carga el archivo de idioma y establece los textos de los controles
        /// en el idioma que corresponde.
        /// </summary>
        public void LoadLanguage()
        {
            try
            {
                Language labels = Language.getInstance();
                btnNew.Label = labels.getLabels(btnNew.Name);
                btnOpenReceivedFacturae.Label = labels.getLabels(btnOpenReceivedFacturae.Name);
                btnSave.Label = labels.getLabels(btnSave.Name);
                btnInvoiceType.Label = labels.getLabels(btnInvoiceType.Name);
                btnMyInvoices.Label = labels.getLabels(btnMyInvoices.Name);
                btLoadXmlInvoice.Label = labels.getLabels(btLoadXmlInvoice.Name);
                btExportToXml.Label = labels.getLabels(btExportToXml.Name);
                btnSettings.Label = labels.getLabels(btnSettings.Name);
                ckBoxIssued.Label = labels.getLabels(ckBoxIssued.Name);
                ckBoxReceived.Label = labels.getLabels(ckBoxReceived.Name);
                ckBoxDraft.Label = labels.getLabels(ckBoxDraft.Name);
                gbxFacturae.Label = labels.getLabels(gbxFacturae.Name);
                gbxTemplates.Label = labels.getLabels(gbxTemplates.Name);
                gpStatus.Label = labels.getLabels(gpStatus.Name);
                wordTemplatesGallery.Label = labels.getLabels(wordTemplatesGallery.Name);
                btInvoiceValidation.Label = labels.getLabels(btInvoiceValidation.Name);
                gbxXML.Label = labels.getLabels(gbxXML.Name);
                gbxReceivedInvoices.Label = labels.getLabels(gbxReceivedInvoices.Name);
                btnImportReceivedInvoice.Label = labels.getLabels(btnImportReceivedInvoice.Name);
                btnNew.ScreenTip = labels.getLabels(btnNew.Name);
                btnSave.ScreenTip = labels.getLabels(btnSave.Name);
                btnInvoiceType.ScreenTip = labels.getLabels(btnInvoiceType.Name);
                btnSettings.ScreenTip = labels.getLabels(btnSettings.Name);
                btnMyInvoices.ScreenTip = labels.getLabels(btnMyInvoices.Name);
                btnImportReceivedInvoice.ScreenTip = labels.getLabels(btnImportReceivedInvoice.Name);
                btInvoiceValidation.ScreenTip = labels.getLabels(btInvoiceValidation.Name);
                btnOpenReceivedFacturae.ScreenTip = labels.getLabels(btnOpenReceivedFacturae.Name);
                btLoadXmlInvoice.ScreenTip = labels.getLabels(btLoadXmlInvoice.Name);
                btExportToXml.ScreenTip = labels.getLabels(btExportToXml.Name);
                wordTemplatesGallery.ScreenTip = labels.getLabels(wordTemplatesGallery.Name);
                ckBoxDraft.ScreenTip = labels.getLabels("gbxStatusScreenTip");
                ckBoxIssued.ScreenTip = labels.getLabels("gbxStatusScreenTip");
                ckBoxReceived.ScreenTip = labels.getLabels("gbxStatusScreenTip");
                btnNew.SuperTip = labels.getLabels("btnNewSuperTip");
                btnSave.SuperTip = labels.getLabels("btnSaveSuperTip");
                btnInvoiceType.SuperTip = labels.getLabels("btnInvoiceTypeSuperTip");
                btnSettings.SuperTip = labels.getLabels("btnSettingsSuperTip");
                btnMyInvoices.SuperTip = labels.getLabels("btnMyInvoicesSuperTip");
                btnImportReceivedInvoice.SuperTip = labels.getLabels("btnImportReceivedInvoiceSuperTip");
                btInvoiceValidation.SuperTip = labels.getLabels("btInvoiceValidationSuperTip");
                btnOpenReceivedFacturae.SuperTip = labels.getLabels("btnOpenReceivedFacturaeSuperTip");
                btLoadXmlInvoice.SuperTip = labels.getLabels("btLoadXmlInvoiceSuperTip");
                btExportToXml.SuperTip = labels.getLabels("btExportToXmlSuperTip");
                wordTemplatesGallery.SuperTip = labels.getLabels("wordTemplatesGallerySuperTip");
                ckBoxDraft.SuperTip = labels.getLabels("gbxStatusSuperTip");
                ckBoxIssued.SuperTip = labels.getLabels("gbxStatusSuperTip");
                ckBoxReceived.SuperTip = labels.getLabels("gbxStatusSuperTip");
                ribbonDropDownItemImpl1.Label = labels.getLabels("BasicTemplateLabel");
                ribbonDropDownItemImpl1.Tag = labels.getLabels("BasicTemplate");
                ribbonDropDownItemImpl2.Label = labels.getLabels("ThirdTemplateLabel");
                ribbonDropDownItemImpl2.Tag = labels.getLabels("ThirdTemplate");
                ribbonDropDownItemImpl3.Label = labels.getLabels("CorrectiveTemplateLabel");
                ribbonDropDownItemImpl3.Tag = labels.getLabels("CorrectiveTemplate");
                ribbonDropDownItemImpl4.Label = labels.getLabels("CorrectiveAndThirdTemplateLabel");
                ribbonDropDownItemImpl4.Tag = labels.getLabels("CorrectiveAndThirdTemplate");

            }
            catch (Exception)
            {
                ControlMessages msg = ControlMessages.getInstance();
                MessageBox.Show(msg.getMessage(ControlMessages.Msg.ErrorLoadLanguage), msg.getMessage(ControlMessages.Msg.CaptionRibbon), MessageBoxButtons.OK, MessageBoxIcon.Error);
            }


        }

        /// <summary>
        /// Método que carga la configuración predeterminada por el usuario de un archivo xml
        /// </summary>
        public void LoadConfiguration()
        {
            //Si no se ha cargado la configuración
            if (configuration == null)
            {
                //Creo una nueva
                configuration = new ConfigData();
                //Si no se puede cargar la configuración
                if (!(XmlFile.LoadObjectFrom(ref configuration, Globals.ThisAddIn.EnvironmentVariable + Paths.ConfigPath)))
                {
                    //Pido al usuario si kiere configurarla o si no se creara uno en blanco
                    ControlMessages msg = ControlMessages.getInstance();
                    //Si si kiere le muestro el formulario de configuracion
                    if (MessageBox.Show(String.Concat(msg.getMessage(ControlMessages.Msg.ErrorLoadConfig), "\n", msg.getMessage(ControlMessages.Msg.InfoConfigModifyOrEmpty), "\n", msg.getMessage(ControlMessages.Msg.InfoConfigQuestion)), msg.getMessage(ControlMessages.Msg.CaptionConfig), MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        //XmlFile.Save(config, pathConfig, config.GetType());
                        FrmSettings frmSettings = new FrmSettings();
                        frmSettings.Configuration = configuration;
                        frmSettings.Show();
                    }
                    //Sino creo uno en blanco
                    else
                    {
                        XmlFile.Save(configuration, Globals.ThisAddIn.EnvironmentVariable + Paths.ConfigPath, configuration.GetType());
                    }
                }
            }
        }


        /// <summary>
        /// Método que actualiza los archivos de gestion de las facturas
        /// </summary>
        /// <param name="SavePath">Parámetro de tipo string que contiene el path físico donde se ha guardado la factura</param>
        /// <param name="agregarRecibidas">Parámetro de tipo bool que indica si es una factura que se quiere añadir a recibidas</param>
        /// <param name="InvoiceType">Parámetro de tipo string que indica el tipo de factura</param>
        public void updateRegistry(string SavePath, bool agregarRecibidas, string InvoiceType)
        {
            if (string.IsNullOrEmpty(SavePath))
            {
                return;
            }
            if (string.IsNullOrEmpty(status))
            {
                ControlMessages msg = ControlMessages.getInstance();
                throw new Exception(msg.getMessage(ControlMessages.Msg.InfoSaveWhiteDoc));
            }
            else
            {
                string path = SavePath;
                if (path.IndexOf(".xlsx") < 0)
                {
                    path = path + ".xlsx";
                }
                if (!path.Equals(string.Empty))
                {
                    try
                    {
                        string serie = Globals.ThisAddIn.GetControlValue(ControlList.Tag.IH_InvoiceSeriesCode);
                        string fecha = Globals.ThisAddIn.GetControlValue(ControlList.Tag.InvIssue_IssueDate);
                        string n_factura = Globals.ThisAddIn.GetControlValue(ControlList.Tag.IH_InvoiceNumber);
                        string cif = Globals.ThisAddIn.GetControlValue(ControlList.Tag.BP_TaxIdentificationNumber);
                        string customer = "";
                        string customerFirstName = "";
                        string customerSecondName = "";
                        string issuerName = "";
                        string issuerFirstName = "";
                        string issuerSecondName = "";

                        if (string.IsNullOrEmpty(serie) || string.IsNullOrEmpty(cif) || string.IsNullOrEmpty(n_factura) || Globals.ThisAddIn.GetControlValue(ControlList.Tag.BP_PersonTypeCode) == null)
                        {
                            if (!agregarRecibidas)
                            {
                                ControlMessages msg = ControlMessages.getInstance();
                                throw new Exception(msg.getMessage(ControlMessages.Msg.InfoCheckDraft));
                            }

                        }

                        if (Globals.ThisAddIn.GetControlValue(ControlList.Tag.BP_PersonTypeCode/*, getControlValueByTag(ControlList.Tag.BP_PersonTypeCode*/).ToLower().Equals("f"))
                        {
                            customer = Globals.ThisAddIn.GetControlValue(ControlList.Tag.BP_Name);
                            customerFirstName = Globals.ThisAddIn.GetControlValue(ControlList.Tag.BP_FirstSurname);
                            customerSecondName = Globals.ThisAddIn.GetControlValue(ControlList.Tag.BP_SecondSurname);
                        }
                        else
                            customer = Globals.ThisAddIn.GetControlValue(ControlList.Tag.BP_CorporateName);

                        if (Globals.ThisAddIn.GetControlValue(ControlList.Tag.SP_PersonTypeCode/*, getControlValueByTag(ControlList.Tag.SP_PersonTypeCode)*/).ToLower().Equals("f"))
                        {
                            issuerName = Globals.ThisAddIn.GetControlValue(ControlList.Tag.SP_Name);
                            issuerFirstName = Globals.ThisAddIn.GetControlValue(ControlList.Tag.SP_FirstSurname);
                            issuerSecondName = Globals.ThisAddIn.GetControlValue(ControlList.Tag.SP_SecondSurname);
                        }
                        else
                            issuerName = Globals.ThisAddIn.GetControlValue(FacturaeFiles.ControlList.Tag.SP_CorporateName);



                        //string importeT = Globals.ThisAddIn.Application.ActiveDocument.Tables[t5].Rows.Last.Cells[3].Range.Text.Trim(x).Trim();

                        string importeT = Globals.ThisAddIn.GetControlValue("totalAmountLine");

                        //CultureInfo cultDate = new CultureInfo("es-ES");
                        CultureInfo cult = new CultureInfo(Globals.ThisAddIn.Application.LanguageSettings.get_LanguageID(Microsoft.Office.Core.MsoAppLanguageID.msoLanguageIDUI));
                        DateTime issueDate = DateTime.Parse(fecha, cult);


                        parser = new XmlFileMngParser();
                        parser.addNewXmlInvoiceRecord(issueDate.Year.ToString(), issueDate.Month.ToString(), status, new XmlInvoice(serie, n_factura, cif, customer, customerFirstName, customerSecondName, issuerName, issuerFirstName, issuerSecondName, fecha, importeT, status, "", path, InvoiceType));

                        object filename = path; object missing = System.Reflection.Missing.Value;



                        Globals.ThisAddIn.Application.ActiveWorkbook.SaveAs(filename, missing, missing, missing, missing, missing, XlSaveAsAccessMode.xlShared, missing, missing, missing, missing, missing);
                        Globals.ThisAddIn.updateTaskPane();
                    }
                    catch (Exception e)
                    {
                        ControlMessages msg = ControlMessages.getInstance();
                        if (e.Message.Equals("InfoInvoiceExist"))
                        {
                            throw e;
                        }
                        MessageBox.Show(e.Message, msg.getMessage(ControlMessages.Msg.CaptionRibbon), MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
            }
        }


        /// <summary>
        /// Método que actualiza los check de estado
        /// </summary>
        public void updateStatusCheck()
        {
            bool i = false;
            bool r = false;
            bool d = false;
            if (status.Equals("ISSUED"))
            {
                i = true;
            }
            if (status.Equals("RECEIVED"))
            {
                r = true;
            }
            if (status.Equals("DRAFT"))
            {
                d = true;
            }
            ckBoxIssued.Checked = i;
            ckBoxReceived.Checked = r;
            ckBoxDraft.Checked = d;
        }

        /// <summary>
        /// Método que cierra una factua en papel
        /// Igual que el metodo de emitir pero sin firma.
        /// </summary>
        public void Cerrar()
        {
            LoadConfiguration();
            SaveFileDialog op = new SaveFileDialog();
            op.Filter = "Arhivos de Excel 2010 (*.xlsx)|*.xlsx";
            op.InitialDirectory = setInitiaDirectory("ISSUED");
            string name = string.Concat(Globals.ThisAddIn.GetControlValue(ControlList.Tag.SP_TaxIdentificationNumber), Globals.ThisAddIn.GetControlValue(ControlList.Tag.IH_InvoiceNumber), Globals.ThisAddIn.GetControlValue(ControlList.Tag.IH_InvoiceSeriesCode));
            op.FileName = name;
            if (op.ShowDialog() == DialogResult.Cancel)
            {
                return;
            }
            string path = Globals.ThisAddIn.EnvironmentVariable + Paths.CustomXmlPartPath;

            if (!string.IsNullOrEmpty(op.FileName))
            {
                try
                {

                    //Globals.ThisAddIn.cerrarFactura(path, configuration);
                    IssuedController emitir = new IssuedController(Globals.ThisAddIn.getAllData());
                    emitir.cerrarFactura(path, configuration);


                    ckBoxIssued.Checked = true;
                    ckBoxReceived.Checked = false;
                    ckBoxDraft.Checked = false;
                    status = "ISSUED";
                    Globals.ThisAddIn.setControlValue(ControlList.Tag.Status, status);


                    string serie = Globals.ThisAddIn.GetControlValue(ControlList.Tag.IH_InvoiceSeriesCode);
                    string n_factura = Globals.ThisAddIn.GetControlValue(ControlList.Tag.IH_InvoiceNumber);
                    string cif = Globals.ThisAddIn.GetControlValue(ControlList.Tag.BP_TaxIdentificationNumber);

                    //Añado la factura al registro de emitidos.

                    updateRegistry(op.FileName, false, "(P)");
                    object readOnly = true; object missing = System.Reflection.Missing.Value;
                    object filename = op.FileName;

                    Globals.ThisAddIn.Application.ActiveWorkbook.Save();

                    ControlMessages msg = ControlMessages.getInstance();
                    MessageBox.Show(msg.getMessage(ControlMessages.Msg.InfoGeneratedInvoice), msg.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Information);

                    string fecha = Globals.ThisAddIn.GetControlValue(ControlList.Tag.InvIssue_IssueDate);
                    //CultureInfo cultDate = new CultureInfo("es-ES");
                    CultureInfo cult = new CultureInfo(Globals.ThisAddIn.Application.LanguageSettings.get_LanguageID(Microsoft.Office.Core.MsoAppLanguageID.msoLanguageIDUI));
                    DateTime issueDate = DateTime.Parse(fecha, cult);
                    //Elimino el borrador
                    parser.removeInvoive(serie, n_factura, cif, Globals.ThisAddIn.EnvironmentVariable + Paths.DraftPath + issueDate.Year.ToString() + issueDate.Month.ToString() + ".xml");
                    Globals.ThisAddIn.updateTaskPane();
                }
                catch (Exception ex)
                {
                    ControlMessages msg = ControlMessages.getInstance();
                    if (ex.Message.Equals("InfoInvoiceExist"))
                    {
                        MessageBox.Show(msg.getMessage(ex.Message), msg.getMessage(ControlMessages.Msg.CaptionRibbon), MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return;
                    }

                    MessageBox.Show(ex.Message, msg.getMessage(ControlMessages.Msg.CaptionRibbon), MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }


        /// <summary>
        /// Metodo que muestra al usuario el cuadro de dialogo para que seleccione donde desea 
        /// guardar la factura
        /// </summary>
        /// <param name="status"></param>
        /// <returns></returns>
        public string saved(string status)
        {

            if (string.IsNullOrEmpty(Globals.ThisAddIn.Application.ActiveWorkbook.Path))
            {
                SaveFileDialog f = new SaveFileDialog();
                f.Filter = "Todos los archivos (*.*)|*.*|Documentos de Excel (*.xlsx)|*.xlsx|Archivos XML (*.xml)|*.xml";
                f.RestoreDirectory = true;
                f.InitialDirectory = setInitiaDirectory(status);
                string name = string.Concat(Globals.ThisAddIn.GetControlValue(ControlList.Tag.SP_TaxIdentificationNumber), "_", Globals.ThisAddIn.GetControlValue(ControlList.Tag.IH_InvoiceNumber), "_", Globals.ThisAddIn.GetControlValue(ControlList.Tag.IH_InvoiceSeriesCode), "_", "(Draft)");
                f.FileName = name;
                if (f.ShowDialog().Equals(DialogResult.Cancel))
                {
                    throw new Exception();
                }
                return f.FileName;
            }
            else
            {
                Globals.ThisAddIn.Application.ActiveWorkbook.Save();
                updateRegistry(Globals.ThisAddIn.Application.ActiveWorkbook.Path + @"\" + Globals.ThisAddIn.Application.ActiveWorkbook.Name, false, "");
                return string.Empty;
            }


        }

        /// <summary>
        /// Método que devuelve el path donde se encuentran las facturas que deterina el estado.
        /// </summary>
        /// <param name="status"></param>
        /// <returns></returns>
        public string setInitiaDirectory(string status)
        {

            LoadConfiguration();
            if (status.ToUpper().Equals("ISSUED".ToUpper()))
                return configuration.UrlIssued;
            else
                if (status.ToUpper().Equals("RECEIVED".ToUpper()))
                    return configuration.UrlRecived;
                else
                    return configuration.UrlDrafts;



        }


        /// <summary>
        /// Método que comprueba si los datos mínimos obligatorios son correctos antes de realizar la emisión de una factura
        /// </summary>
        /// <param name="d">Diccionario de datos</param>
        /// <returns>Datos correctos o incorrectos</returns>
        public string ComprobarDatosObligatorios(Dictionary<string, string> d)
        {
            if (String.IsNullOrEmpty(d["InvIssue_IssueDate"]))
            {
                return ("InvIssue_IssueDate");
            }
            if (String.IsNullOrEmpty(d["IH_InvoiceSeriesCode"]))
            {
                return ("IH_InvoiceSeriesCode");
            }
            if (String.IsNullOrEmpty(d["IH_InvoiceNumber"]))
            {
                return ("IH_InvoiceNumber");
            }
            if (String.IsNullOrEmpty(d["IH_InvoiceClass"]))
            {
                return ("IH_InvoiceClass");
            }
            if (d["IH_InvoiceClass"].Equals("OR"))
            {
                if (String.IsNullOrEmpty(d["CORR_InvoiceSeriesCode"]))
                {
                    return ("CORR_InvoiceSeriesCode");
                }
                if (String.IsNullOrEmpty(d["CORR_InvoiceNumber"]))
                {
                    return ("CORR_InvoiceNumber");
                }
                if (String.IsNullOrEmpty(d["CORR_ReasonDescription"]))
                {
                    return ("CORR_ReasonDescription");
                }
                if (String.IsNullOrEmpty(d["CORR_CorrectionMethodDescription"]))
                {
                    return ("CORR_CorrectionMethodDescription");
                }
                if (String.IsNullOrEmpty(d["CORR_TaxPeriod_StartDate"]))
                {
                    return ("CORR_TaxPeriod_StartDate");
                }
                if (String.IsNullOrEmpty(d["CORR_TaxPeriod_EndDate"]))
                {
                    return ("CORR_TaxPeriod_EndDate");
                }

            }
            if (String.IsNullOrEmpty(d["SP_PersonTypeCode"]))
            {
                return ("SP_PersonTypeCode");
            }
            if (d["SP_PersonTypeCode"].Equals("F"))
            {
                if (String.IsNullOrEmpty(d["SP_Name"]))
                {
                    return ("SP_Name");
                }
                if (String.IsNullOrEmpty(d["SP_FirstSurname"]))
                {
                    return ("SP_FirstSurname");
                }
            }
            else if (d["SP_PersonTypeCode"].Equals("J"))
            {
                if (String.IsNullOrEmpty(d["SP_CorporateName"]))
                {
                    return ("SP_CorporateName");
                }
            }
            else
            {
                return "Tipo Persona No definido";
            }
            if (String.IsNullOrEmpty(d["SP_ResidenceTypeCode"]))
            {
                return ("SP_ResidenceTypeCode");
            }
            if (String.IsNullOrEmpty(d["SP_TaxIdentificationNumber"]))
            {
                return ("SP_TaxIdentificationNumber");
            }
            if (String.IsNullOrEmpty(d["SP_ResidenceTypeCode"]))
            {
                return ("SP_ResidenceTypeCode");
            }
            if (String.IsNullOrEmpty(d["SP_Address"]))
            {
                return ("SP_Address");
            }
            if (String.IsNullOrEmpty(d["SP_CountryCode"]))
            {
                return ("SP_CountryCode");
            }
            if (String.IsNullOrEmpty(d["SP_PostCode"]))
            {
                return ("SP_PostCode");
            }
            if (String.IsNullOrEmpty(d["SP_Province"]))
            {
                return ("SP_Province");
            }
            if (String.IsNullOrEmpty(d["SP_Town"]))
            {
                return ("SP_Town");
            }

            if (String.IsNullOrEmpty(d["BP_PersonTypeCode"]))
            {
                return ("BP_PersonTypeCode");
            }
            if (d["BP_PersonTypeCode"].Equals("F"))
            {
                if (String.IsNullOrEmpty(d["BP_Name"]))
                {
                    return ("BP_Name");
                }
                if (String.IsNullOrEmpty(d["BP_FirstSurname"]))
                {
                    return ("BP_FirstSurname");
                }
            }
            else if (d["BP_PersonTypeCode"].Equals("J"))
            {
                if (String.IsNullOrEmpty(d["BP_CorporateName"]))
                {
                    return ("BP_CorporateName");
                }
            }
            else
            {
                return "Tipo Persona No definido";
            }
            if (String.IsNullOrEmpty(d["BP_ResidenceTypeCode"]))
            {
                return ("BP_ResidenceTypeCode");
            }
            if (String.IsNullOrEmpty(d["BP_TaxIdentificationNumber"]))
            {
                return ("BP_TaxIdentificationNumber");
            }
            if (String.IsNullOrEmpty(d["BP_ResidenceTypeCode"]))
            {
                return ("BP_ResidenceTypeCode");
            }
            if (String.IsNullOrEmpty(d["BP_Address"]))
            {
                return ("BP_Address");
            }
            if (String.IsNullOrEmpty(d["BP_CountryCode"]))
            {
                return ("BP_CountryCode");
            }
            if (String.IsNullOrEmpty(d["BP_PostCode"]))
            {
                return ("BP_PostCode");
            }
            if (String.IsNullOrEmpty(d["BP_Province"]))
            {
                return ("BP_Province");
            }
            if (String.IsNullOrEmpty(d["BP_Town"]))
            {
                return ("BP_Town");
            }

            if (String.IsNullOrEmpty(d["InvoiceIssuerType"]))
            {
                return ("InvoiceIssuerType");
            }
            if (d["InvoiceIssuerType"].Equals("TE"))
            {
                if (String.IsNullOrEmpty(d["TH_PersonTypeCode"]))
                {
                    return ("TH_PersonTypeCode");
                }
                if (d["TH_PersonTypeCode"].Equals("F"))
                {
                    if (String.IsNullOrEmpty(d["TH_Name"]))
                    {
                        return ("TH_Name");
                    }
                    if (String.IsNullOrEmpty(d["TH_FirstSurname"]))
                    {
                        return ("TH_FirstSurname");
                    }
                }
                else if (d["TH_PersonTypeCode"].Equals("J"))
                {
                    if (String.IsNullOrEmpty(d["TH_CorporateName"]))
                    {
                        return ("TH_CorporateName");
                    }
                }
                else
                {
                    return "Tipo Persona No definido";
                }
                if (String.IsNullOrEmpty(d["TH_ResidenceTypeCode"]))
                {
                    return ("TH_ResidenceTypeCode");
                }
                if (String.IsNullOrEmpty(d["SP_TaxIdentificationNumber"]))
                {
                    return ("TH_TaxIdentificationNumber");
                }
                if (String.IsNullOrEmpty(d["SP_ResidenceTypeCode"]))
                {
                    return ("TH_ResidenceTypeCode");
                }
                if (String.IsNullOrEmpty(d["SP_Address"]))
                {
                    return ("TH_Address");
                }
                if (String.IsNullOrEmpty(d["SP_CountryCode"]))
                {
                    return ("TH_CountryCode");
                }
                if (String.IsNullOrEmpty(d["TH_PostCode"]))
                {
                    return ("TH_PostCode");
                }
                if (String.IsNullOrEmpty(d["TH_Province"]))
                {
                    return ("TH_Province");
                }
                if (String.IsNullOrEmpty(d["TH_Town"]))
                {
                    return ("TH_Town");
                }
            }
            return "";
        }


        /// <summary>
        /// Método que devuelve una referencia al checkbox de Emitida
        /// </summary>
        /// <returns></returns>
        public RibbonCheckBox getCkBoxIssued()
        {
            return ckBoxIssued;
        }

        /// <summary>
        /// Método que devuelve una referencia al checkbox de Recibida
        /// </summary>
        /// <returns></returns>
        public RibbonCheckBox getCkBoxReceived()
        {
            return ckBoxReceived;
        }

        /// <summary>
        /// Método que devuelve una referencia al checkbox de Borrador
        /// </summary>
        /// <returns></returns>
        public RibbonCheckBox getCkBoxDraft()
        {
            return ckBoxDraft;
        }

        /// <summary>
        /// Método que cambia el valor de la variable de estado por el que recibe por parámetro.
        /// </summary>
        /// <param name="status">Parámetro de tipo string con el nuevo estado</param>
        public void setStatus(string status)
        {
            this.status = status;
        }

        #endregion



    }
}
